package cn.iocoder.devlop.module.annual.report.cuentreginfo.service;

import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.IdUtil;
import cn.hutool.core.util.NumberUtil;
import cn.hutool.core.util.ObjUtil;
import cn.hutool.core.util.StrUtil;
import cn.iocoder.devlop.framework.mybatis.core.query.LambdaQueryWrapperX;
import cn.iocoder.devlop.module.annual.report.baseinfo.dal.dataobject.BaseinfoDO;
import cn.iocoder.devlop.module.annual.report.baseinfo.service.BaseinfoService;
import cn.iocoder.devlop.module.annual.report.cuentreginfo.controller.vo.CuEntreginfoCreateReqVO;
import cn.iocoder.devlop.module.annual.report.cuentreginfo.controller.vo.CuEntreginfoOverwriteVO;
import cn.iocoder.devlop.module.annual.report.cuentreginfo.convert.CuEntreginfoConvert;
import cn.iocoder.devlop.module.annual.report.cuentreginfo.dal.CuEntreginfoMapper;
import cn.iocoder.devlop.module.annual.report.cuentreginfo.dal.dataobject.CuEntreginfoDO;
import cn.iocoder.devlop.module.annual.report.utils.IdGenerateUtil;
import cn.iocoder.devlop.module.annual.report.utils.ObjectComparisonUtil;
import cn.iocoder.devlop.module.annual.report.utils.ReportYearHelper;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.validation.annotation.Validated;

import javax.annotation.Resource;
import java.util.List;

/**
 * 年报报关信息 Service 实现类
 *
 * @author sunhao
 */
@Service
@Validated
public class CuEntreginfoServiceImpl implements CuEntreginfoService {

    @Resource
    private CuEntreginfoMapper cuEntreginfoMapper;

    @Resource
    private BaseinfoService baseinfoService;


    @Override
    public List<CuEntreginfoDO> getCuEntreginfoList(String regno, String ancheyear) {
        ReportYearHelper.setYear(NumberUtil.parseInt(ancheyear));
        String ancheid = IdGenerateUtil.getAncheid(regno, ancheyear);
        return cuEntreginfoMapper.selectListByAncheid(ancheid);
    }

    @Override
    public void deleteCuEntreginfoAll(String regno, String ancheyear) {
        String ancheid = IdGenerateUtil.getAncheid(regno, ancheyear);
        ReportYearHelper.setYear(NumberUtil.parseInt(ancheyear));
        LambdaQueryWrapperX<CuEntreginfoDO> wrapperX = new LambdaQueryWrapperX<>();
        wrapperX.eq(CuEntreginfoDO::getAncheid, ancheid);
        cuEntreginfoMapper.delete(wrapperX);
    }

    @Override
    public void createCuEntreginfoByList(String regno, String ancheyear, List<CuEntreginfoCreateReqVO> cuEntreginfoList) {
        String ancheid = IdGenerateUtil.getAncheid(regno, ancheyear);
        ReportYearHelper.setYear(NumberUtil.parseInt(ancheyear));
        if (CollUtil.isNotEmpty(cuEntreginfoList)) {
            List<CuEntreginfoDO> cuEntreginfoDOS = CuEntreginfoConvert.INSTANCE.convertList01(cuEntreginfoList);
            for (CuEntreginfoDO cuEntreginfo : cuEntreginfoDOS) {
                cuEntreginfo.setAncheid(ancheid);
                cuEntreginfo.setRegid(IdUtil.simpleUUID());
            }
            cuEntreginfoMapper.insertBatch(cuEntreginfoDOS);
        }
    }

    @Override
    @Transactional(rollbackFor = Exception.class)
    public void overwriteCuEntreginfo(CuEntreginfoOverwriteVO updateReqVO) {
        BaseinfoDO baseinfo = baseinfoService.getBaseinfo(updateReqVO.getRegno(), updateReqVO.getAncheyear());
        if (ObjUtil.isNotEmpty(baseinfo)){
            if (StrUtil.equals(baseinfo.getState(),"02") ||StrUtil.equals(baseinfo.getState(),"03")) {
                List<CuEntreginfoDO> oldAlterstockinfoList = getCuEntreginfoList(updateReqVO.getRegno(), updateReqVO.getAncheyear());
                List<CuEntreginfoCreateReqVO> newAlterstockinfoList = updateReqVO.getCuEntreginfoList();
                List<CuEntreginfoCreateReqVO> oldreqs = CuEntreginfoConvert.INSTANCE.convertList3(oldAlterstockinfoList);
                ObjectComparisonUtil.compareObjectList(oldreqs,newAlterstockinfoList,IdGenerateUtil.getAncheid(updateReqVO.getRegno(), updateReqVO.getAncheyear()),"股权变更");
            }
        }
        deleteCuEntreginfoAll(updateReqVO.getRegno(), updateReqVO.getAncheyear());
        createCuEntreginfoByList(updateReqVO.getRegno(), updateReqVO.getAncheyear(), updateReqVO.getCuEntreginfoList());
        baseinfoService.updateState(updateReqVO.getRegno(), updateReqVO.getAncheyear());
    }

}
